package com.malou.client;

import java.util.List;

import com.extjs.gxt.ui.client.GXT;
import com.extjs.gxt.ui.client.Style.LayoutRegion;
import com.extjs.gxt.ui.client.Style.Scroll;
import com.extjs.gxt.ui.client.event.BaseEvent;
import com.extjs.gxt.ui.client.event.ComponentEvent;
import com.extjs.gxt.ui.client.event.Events;
import com.extjs.gxt.ui.client.event.Listener;
import com.extjs.gxt.ui.client.event.MessageBoxEvent;
import com.extjs.gxt.ui.client.util.Margins;
import com.extjs.gxt.ui.client.util.Theme;
import com.extjs.gxt.ui.client.widget.ContentPanel;
import com.extjs.gxt.ui.client.widget.Label;
import com.extjs.gxt.ui.client.widget.LayoutContainer;
import com.extjs.gxt.ui.client.widget.MessageBox;
import com.extjs.gxt.ui.client.widget.TabItem;
import com.extjs.gxt.ui.client.widget.TabPanel;
import com.extjs.gxt.ui.client.widget.Text;
import com.extjs.gxt.ui.client.widget.Viewport;
import com.extjs.gxt.ui.client.widget.layout.BorderLayout;
import com.extjs.gxt.ui.client.widget.layout.BorderLayoutData;
import com.extjs.gxt.ui.client.widget.layout.CenterLayout;
import com.extjs.gxt.ui.client.widget.layout.FitLayout;
import com.extjs.gxt.ui.client.widget.layout.HBoxLayout;
import com.extjs.gxt.ui.client.widget.layout.HBoxLayoutData;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.logical.shared.CloseEvent;
import com.google.gwt.event.logical.shared.CloseHandler;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.Window.ClosingEvent;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.RootPanel;
import com.malou.client.graficosestadisticos.GPrendaVendidaxFechaPanel;
import com.malou.client.graficosestadisticos.GPrendasVendidasxDiaPanel;
import com.malou.client.graficosestadisticos.GPrendasVendidasxFechaPanel;
import com.malou.client.graficosestadisticos.PrendaVendidaxFechaPanel;
import com.malou.client.graficosestadisticos.PrendasVendidasxDiaPanel;
import com.malou.client.graficosestadisticos.PrendasVendidasxFechaPanel;
import com.malou.client.pagos.bancos.BancoPanel;
import com.malou.client.pagos.pagoletras.LetrasTabPanel;
import com.malou.client.reportes.GPrendasVendidasPanel;
import com.malou.client.reportes.GReporteIngresosTallerPanel;
import com.malou.client.reportes.GReporteSaldosPanel;
import com.malou.client.reportes.GReporteStockPanel;
import com.malou.client.reportes.GReporteVentasPanel;
import com.malou.client.reportes.PrendasVendidasPanel;
import com.malou.client.reportes.ReporteEntradasPanel;
import com.malou.client.reportes.ReporteIngresosTallerPanel;
import com.malou.client.reportes.ReporteInventarioPanel;
import com.malou.client.reportes.ReporteSaldosPanel;
import com.malou.client.reportes.ReporteSalidasPanel;
import com.malou.client.reportes.ReporteStockPanel;
import com.malou.client.reportes.ReporteVentasPanel;
import com.malou.client.reportes.ResumenPanel;
import com.malou.client.seguridad.login.LoginDialog;
import com.malou.client.seguridad.menu.MenuLateral;
import com.malou.client.seguridad.menu.MenuOpciones;
import com.malou.client.seguridad.menu.MenuPanel;
import com.malou.client.seguridad.usuario.Usuarios;
import com.malou.client.ventas.cajainicial.CajaInicialForm;
import com.malou.client.ventas.cliente.ClientePanel;
import com.malou.client.ventas.colores.ColorPanel;
import com.malou.client.ventas.gasto.GastoPanel;
import com.malou.client.ventas.modeloprenda.ModeloPrendaPanel;
import com.malou.client.ventas.movimiento.entrada.MovimientoEntradaPanel;
import com.malou.client.ventas.movimiento.salida.MovimientoSalidaPanel;
import com.malou.client.ventas.proveedor.ProveedorPanel;
import com.malou.client.ventas.separacion.SeparacionPanel;
import com.malou.client.ventas.serie.SeriePanel;
import com.malou.client.ventas.tallas.TallaPanel;
import com.malou.client.ventas.telas.TelaPanel;
import com.malou.client.ventas.tienda.TiendaPanel;
import com.malou.client.ventas.tipoprendas.TipoPrendaPanel;
import com.malou.client.ventas.venta.VentaPanel;

public class Malou implements EntryPoint {

	String startingToken = "";
	public TabPanel center;
	private MenuLateral panel;
	private MalouConstants constants = GWT.create(MalouConstants.class);
	public Label tienda;
	public Label usuario;
	Viewport viewport;
	public LayoutContainer north;

	public Integer usuario_logueado_id;
	public boolean superusuario;
	public List<String> permisos;

	private Timer sessionTimeoutResponseTimer;
	private MyServiceAsync service = GWT.create(MyService.class);;
	private final int INITIAL_TIMEOUT_PAD = 60000;
	private final int TIMEOUT_PAD = 15000;
	public Boolean valor;

	public void onModuleLoad() {
		initSessionTimers();

		Window.setTitle(constants.sistemaMarcocruzado());

		GXT.setDefaultTheme(Theme.BLUE, false);
		
	
		Usuarios.malou = this;
		Usuarios.checkSession();

		GXT.hideLoadingPanel("loading");

	}

	public void loadLogin() {
		LoginDialog dialog = new LoginDialog();
		dialog.setClosable(false);
		
			dialog.show();
		
			

	}

	public void dolayout() {
		BorderLayout bl = new BorderLayout();
		viewport = new Viewport();
		viewport.setLayout(bl);

		north = new LayoutContainer();

		ContentPanel west = new ContentPanel();
		west.setHeading(constants.principalTienda());
		panel = new MenuLateral(usuario_logueado_id);
		panel.malou = this;
		west.setScrollMode(Scroll.AUTOY);
		west.add(panel);
		center = new TabPanel();

		center.setMinTabWidth(115);

		center.setAnimScroll(true);
		center.setTabScroll(true);
		center.setCloseContextMenu(true);
		center.add(new TabItem(constants.principalInicio()));
		center.setBounds(10, 10, 300, 300);

		BorderLayoutData northData = new BorderLayoutData(LayoutRegion.NORTH,
				30);

		BorderLayoutData westData = new BorderLayoutData(LayoutRegion.WEST, 200);
		westData.setCollapsible(true);
		westData.setFloatable(true);
		westData.setSplit(true);
		westData.setMargins(new Margins(5, 0, 5, 5));

		BorderLayoutData centerData = new BorderLayoutData(LayoutRegion.CENTER);
		centerData.setMargins(new Margins(5));

		viewport.add(north, northData);
		viewport.add(west, westData);
		viewport.add(center, centerData);

		RootPanel.get().add(viewport);
	}

	public void loadProgram(TabItem pti) {
		String parametro = pti.getItemId();
		if (parametro.equals("tiendas")) {
			TiendaPanel tiendapanel = new TiendaPanel();
			pti.setLayout(new FitLayout());
			if (!superusuario && permisos != null)
				tiendapanel.setPermisos(permisos);
			pti.add(tiendapanel);
		} else if (parametro.equals("menus")) {
			MenuPanel menupanel = new MenuPanel();
			pti.setLayout(new FitLayout());
			pti.add(menupanel);
		} else if (parametro.equals("clientes")) {
			ClientePanel clientepanel = new ClientePanel();
			pti.setLayout(new FitLayout());
			if (!superusuario && permisos != null)
				clientepanel.setPermisos(permisos);
			pti.add(clientepanel);
		} else if (parametro.equals("proveedores")) {
			ProveedorPanel proveedorpanel = new ProveedorPanel();
			pti.setLayout(new FitLayout());
			if (!superusuario && permisos != null)
				proveedorpanel.setPermisos(permisos);
			pti.add(proveedorpanel);
		} else if (parametro.equals("tipoprendas")) {
			TipoPrendaPanel tipoprendapanel = new TipoPrendaPanel();
			pti.setLayout(new FitLayout());
			if (!superusuario && permisos != null)
				tipoprendapanel.setPermisos(permisos);
			pti.add(tipoprendapanel);
		} else if (parametro.equals("series")) {
			SeriePanel seriepanel = new SeriePanel();
			pti.setLayout(new FitLayout());
			if (!superusuario && permisos != null)
				seriepanel.setPermisos(permisos);
			pti.add(seriepanel);
		} else if (parametro.equals("modeloprendas")) {
			ModeloPrendaPanel modeloprendapanel = new ModeloPrendaPanel();
			pti.setLayout(new FitLayout());
			if (!superusuario && permisos != null)
				modeloprendapanel.setPermisos(permisos);
			pti.add(modeloprendapanel);

			/*
			 * pti.addListener(Events.Close, new Listener<BaseEvent>() {
			 * 
			 * @Override public void handleEvent(BaseEvent be) {
			 * //System.out.println("cerrrar"); ModeloPrendas.noescuchar(); }
			 * });
			 */
		} else if (parametro.equals("cajainicial")) {
			pti.setLayout(new CenterLayout());
			pti.add(new CajaInicialForm());

		} else if (parametro.equals("ventas")) {
			VentaPanel ventapanel = new VentaPanel();
			pti.setLayout(new FitLayout());
			if (!superusuario && permisos != null)
				ventapanel.setPermisos(permisos);
			pti.add(ventapanel);
		} else if (parametro.equals("entrada")) {
			MovimientoEntradaPanel movimientoentradapanel = new MovimientoEntradaPanel();
			pti.setLayout(new FitLayout());
			if (!superusuario && permisos != null)
				movimientoentradapanel.setPermisos(permisos);
			pti.add(movimientoentradapanel);
		} else if (parametro.equals("salida")) {
			MovimientoSalidaPanel movimientosalidapanel = new MovimientoSalidaPanel();
			pti.setLayout(new FitLayout());
			if (!superusuario && permisos != null)
				movimientosalidapanel.setPermisos(permisos);
			pti.add(movimientosalidapanel);
		} else if (parametro.equals("separaciones")) {
			SeparacionPanel separacionpanel = new SeparacionPanel();
			pti.setLayout(new FitLayout());
			if (!superusuario && permisos != null)
				separacionpanel.setPermisos(permisos);
			pti.add(separacionpanel);
		} else if (parametro.equals("gastos")) {
			GastoPanel gastopanel = new GastoPanel();
			pti.setLayout(new FitLayout());
			if (!superusuario && permisos != null)
				gastopanel.setPermisos(permisos);
			pti.add(gastopanel);
		} else if (parametro.equals("resumen")) {
			ResumenPanel resumenpanel = new ResumenPanel();
			pti.setLayout(new FitLayout());
			if (!superusuario && permisos != null)
				resumenpanel.setPermisos(permisos);
			pti.add(resumenpanel);
		} else if (parametro.equals("prendasvendidas")) {
			PrendasVendidasPanel prendasvendidaspanel = new PrendasVendidasPanel();
			pti.setLayout(new FitLayout());
			if (!superusuario && permisos != null)
				prendasvendidaspanel.setPermisos(permisos);
			pti.add(prendasvendidaspanel);
		} else if (parametro.equals("reporteventas")) {
			ReporteVentasPanel reporteventas = new ReporteVentasPanel();
			pti.setLayout(new FitLayout());
			if (!superusuario && permisos != null)
				reporteventas.setPermisos(permisos);
			pti.add(reporteventas);
		} else if (parametro.equals("reportestock")) {
			ReporteStockPanel reportestock = new ReporteStockPanel();
			pti.setLayout(new FitLayout());
			if (!superusuario && permisos != null)
				reportestock.setPermisos(permisos);
			pti.add(reportestock);
		} else if (parametro.equals("reporteinventario")) {
			ReporteInventarioPanel reporteinventario = new ReporteInventarioPanel();
			pti.setLayout(new FitLayout());
			if (!superusuario && permisos != null)
				reporteinventario.setPermisos(permisos);
			pti.add(reporteinventario);
		} else if (parametro.equals("ingresostaller")) {
			ReporteIngresosTallerPanel reporteingresos = new ReporteIngresosTallerPanel();
			pti.setLayout(new FitLayout());
			if (!superusuario && permisos != null)
				reporteingresos.setPermisos(permisos);
			pti.add(reporteingresos);
		} else if (parametro.equals("reportesaldos")) {
			ReporteSaldosPanel reportesaldos = new ReporteSaldosPanel();
			pti.setLayout(new FitLayout());
			if (!superusuario && permisos != null)
				reportesaldos.setPermisos(permisos);
			pti.add(reportesaldos);
		} else if (parametro.equals("movimientoentradas")) {
			ReporteEntradasPanel reporteentradas = new ReporteEntradasPanel();
			pti.setLayout(new FitLayout());
			if (!superusuario && permisos != null)
				reporteentradas.setPermisos(permisos);
			pti.add(reporteentradas);
		} else if (parametro.equals("movimientosalidas")) {
			ReporteSalidasPanel reportesalidas = new ReporteSalidasPanel();
			pti.setLayout(new FitLayout());
			if (!superusuario && permisos != null)
				reportesalidas.setPermisos(permisos);
			pti.add(reportesalidas);
		} else if (parametro.equals("gprendasvendidas")) {
			GPrendasVendidasPanel gprendasvendidaspanel = new GPrendasVendidasPanel();
			pti.setLayout(new FitLayout());
			pti.add(gprendasvendidaspanel);
		} else if (parametro.equals("greporteventas")) {
			GReporteVentasPanel greporteventas = new GReporteVentasPanel();
			pti.setLayout(new FitLayout());
			pti.add(greporteventas);
		} else if (parametro.equals("greportestock")) {
			GReporteStockPanel greportestock = new GReporteStockPanel();
			pti.setLayout(new FitLayout());
			pti.add(greportestock);
		} else if (parametro.equals("gingresostaller")) {
			GReporteIngresosTallerPanel greporteingresos = new GReporteIngresosTallerPanel();
			pti.setLayout(new FitLayout());
			pti.add(greporteingresos);
		} else if (parametro.equals("greportesaldos")) {
			GReporteSaldosPanel greportesaldos = new GReporteSaldosPanel();
			pti.setLayout(new FitLayout());
			pti.add(greportesaldos);
		} else if (parametro.equals("prendasvendidasxdia")) {
			PrendasVendidasxDiaPanel prendasvendidasxdia = new PrendasVendidasxDiaPanel();
			pti.setLayout(new FitLayout());
			if (!superusuario && permisos != null)
				prendasvendidasxdia.setPermisos(permisos);
			pti.add(prendasvendidasxdia);
		} else if (parametro.equals("gprendasvendidasxdia")) {
			GPrendasVendidasxDiaPanel gprendasvendidasxdia = new GPrendasVendidasxDiaPanel();
			pti.setLayout(new FitLayout());
			pti.add(gprendasvendidasxdia);
		} else if (parametro.equals("prendavendidaxfecha")) {
			PrendaVendidaxFechaPanel prendavendidaxfecha = new PrendaVendidaxFechaPanel();
			pti.setLayout(new FitLayout());
			if (!superusuario && permisos != null)
				prendavendidaxfecha.setPermisos(permisos);
			pti.add(prendavendidaxfecha);
		} else if (parametro.equals("ventasxfecha")) {
			PrendasVendidasxFechaPanel prendasvendidaxfecha = new PrendasVendidasxFechaPanel();
			pti.setLayout(new FitLayout());
			if (!superusuario && permisos != null)
				prendasvendidaxfecha.setPermisos(permisos);
			pti.add(prendasvendidaxfecha);
		} else if (parametro.equals("gventasxfecha")) {
			GPrendasVendidasxFechaPanel gprendasvendidaxfecha = new GPrendasVendidasxFechaPanel();
			pti.setLayout(new FitLayout());
			pti.add(gprendasvendidaxfecha);
		} else if (parametro.equals("gprendavendidaxfecha")) {
			GPrendaVendidaxFechaPanel gprendavendidaxfecha = new GPrendaVendidaxFechaPanel();
			pti.setLayout(new FitLayout());
			pti.add(gprendavendidaxfecha);
		} else if (parametro.equals("telas")) {
			TelaPanel telapanel = new TelaPanel();
			pti.setLayout(new FitLayout());
			if (!superusuario && permisos != null)
				telapanel.setPermisos(permisos);
			pti.add(telapanel);
		} else if (parametro.equals("tallas")) {
			TallaPanel tallapanel = new TallaPanel();
			pti.setLayout(new FitLayout());
			if (!superusuario && permisos != null)
				tallapanel.setPermisos(permisos);
			pti.add(tallapanel);
		} else if (parametro.equals("colores")) {
			ColorPanel colorpanel = new ColorPanel();
			pti.setLayout(new FitLayout());
			if (!superusuario && permisos != null)
				colorpanel.setPermisos(permisos);
			pti.add(colorpanel);
		} else if (parametro.equals("bancos")) {
			BancoPanel bancopanel = new BancoPanel();
			pti.setLayout(new FitLayout());
			if (!superusuario && permisos != null)
				bancopanel.setPermisos(permisos);
			pti.add(bancopanel);
		} else if (parametro.equals("letras")) {
			LetrasTabPanel letraspanel = new LetrasTabPanel();
			pti.setLayout(new FitLayout());
			// if(!superusuario && permisos != null)
			// letraspanel.setPermisos(permisos);
			pti.add(letraspanel);
		} else
			pti.addText(pti.getItemId()); // el id del tab es el parametro

		pti.addListener(Events.Select, new Listener<ComponentEvent>() {
			@Override
			public void handleEvent(ComponentEvent be) {
				TabPanel tp = (TabPanel) be.getSource();
				tp.getSelectedItem().getData("selectItem");

				MenuOpciones mn = (MenuOpciones) tp.getSelectedItem().getData(
						"itemmenu");
				panel.tree.getSelectionModel().deselectAll();
				panel.tree.getSelectionModel().select(mn, true);

			}
		});
	}

	public void addButtonExit(String tiendaName, String responsable) {

		HBoxLayout layout = new HBoxLayout();

		north.setLayout(layout);
		Text text = new Text(constants.sistemaMarcocruzado());
		text.addStyleName("appTitle");
		north.add(text, new HBoxLayoutData());
		HBoxLayoutData flex = new HBoxLayoutData();
		flex.setFlex(1);
		north.add(new Text(), flex);

		tienda = new Label(tiendaName);
		tienda.addStyleName("appTienda");
		north.add(tienda, new HBoxLayoutData(new Margins(8, 5, 0, 0)));

		usuario = new Label(responsable);
		usuario.addStyleName("appUsuario");
		north.add(usuario, new HBoxLayoutData(new Margins(8, 5, 0, 0)));

		Label logout = new Label(constants.logout());
		logout.addStyleName("appLogout");
		logout.addListener(Events.OnClick, new Listener<BaseEvent>() {

			@Override
			public void handleEvent(BaseEvent be) {
				// ModeloPrendas.noescuchar();

				
				Usuarios.logout();
				RootPanel.get().clear();
				loadLogin();
				System.out.println("servidor:");
				sessionTimeoutResponseTimer.cancel();
			}

		});
		north.add(logout, new HBoxLayoutData(new Margins(8, 5, 0, 0)));
		north.addStyleName("appHeading");
		north.layout();

		Window.addWindowClosingHandler(new Window.ClosingHandler() {
			@Override
			public void onWindowClosing(ClosingEvent event) {
				// event.setMessage("Desea Salir del Sistema?");
				// ModeloPrendas.noescuchar();
				// Usuarios.logout();
			}
		});

		Window.addCloseHandler(new CloseHandler<Window>() {

			@Override
			public void onClose(CloseEvent<Window> arg0) {
				// System.out.println("cerrado");
				// ModeloPrendas.noescuchar();
				// Usuarios.logout();
			}
		});

	}

	private void initSessionTimers() {

		service.getUserSessionTimeout(new AsyncCallback<Integer>() {
			public void onSuccess(Integer timeout) {
				sessionTimeoutResponseTimer = new Timer() {
					@Override
					public void run() {
						checkUserSessionAlive();
					}
				};
				sessionTimeoutResponseTimer.schedule(timeout
						+ INITIAL_TIMEOUT_PAD);
			}

			public void onFailure(Throwable caught) {
				displaySessionTimedOut();
			}
		});
	}

	private void checkUserSessionAlive() {
		service.getUserSessionTimeout(new AsyncCallback<Integer>() {
			public void onSuccess(Integer timeout) {
				sessionTimeoutResponseTimer.cancel();
				sessionTimeoutResponseTimer.schedule(timeout + TIMEOUT_PAD);
			}

			public void onFailure(Throwable caught) {
				displaySessionTimedOut();
			}
		});

	}

	private void displaySessionTimedOut() {
		MessageBox.alert(constants.sistemaMarcocruzado(),
				constants.suSessionHaExpirado(),
				new Listener<MessageBoxEvent>() {

					public void handleEvent(MessageBoxEvent be) {
						Window.Location.reload();
					}
				});
	}

}
